<?php

require_once 'Lib/PHPExcel.php';

/**
 * Model che rappresenta un offerta nel DB.
 */
class Offerta extends StdModel
{

	private static $singleton = NULL;

	/**
	 * Ritorna una istanza globale di questo model.
	 * @return mixed La istanza globale.
	 */
	public static function getInstance()
	{
		if(self::$singleton == NULL)
			self::$singleton = new Offerta();
		return self::$singleton;
	}

	/*
	 * Specifiche attributi del tipo del Model rappresentato da questa classe
	 */
	public $attribTableName = "Offerta";
	public $attribLabel = "Oggetto";
	public $attribNames = array(STD_ID, "idAgente", "Oggetto", "Pagamento", "Trasporto",
		"Consegna", "Note", "idCliente", "Referente", "Data");
	public $attribExcludeFromAdd = array(STD_ID);
	public $attribExcludeFromEdit = array(STD_ID);
	public $attribLongNames = array(STD_ID => "ID", "idAgente" => "Agente",
		"Oggetto" => "Oggetto", "Pagamento" => "Pagamento", "Trasporto" => "Trasporto",
		"Consegna" => "Consegna", "Note" => "Note", "idCliente" => "Cliente", "Referente" => "Referente", "Data" => "Data");
	public $attribIsImportant = array(STD_ID => 2, "idAgente" => 1, "Oggetto" => 1, "Pagamento" => 0,
		"Trasporto" => 0, "Consegna" => 0, "Note" => 0, "idCliente" => 1, "Referente" => 0, "Data" => 1);
	public $attribIsNumeric = array(STD_ID => true, "idAgente" => true, "Oggetto" => false,
		"Pagamento" => false, "Trasporto" => false, "Consegna" => false,
		"Note" => false, "idCliente" => true, "Referente" => false, "Data" => false);
	public $attribIsForeignKey = array(STD_ID => false, "idAgente" => "Agenti", "Oggetto" => false,
		"Pagamento" => false, "Trasporto" => false, "Consegna" => false,
		"Note" => false, "idCliente" => "Clienti", "Referente" => false, "Data" => false);

	const joinTable = "(Offerta LEFT JOIN Agente ON Offerta.idAgente = Agente.ID) LEFT JOIN Cliente ON Offerta.idCliente = Cliente.ID";
	const joinSelect ="Offerta.*, Agente.Nome AS NomeAgente, Agente.Cognome AS CognomeAgente, Cliente.Ragsoc AS RagsocCliente, Cliente.Referente AS ReferenteCliente";

	/*
	 * Specifiche per gli elementi form associati agli attributi
	 */
	private static $attribHTMLFormValue = array(STD_ID => FORM_HIDDEN, "idAgente" => FORM_EXTERNAL_SELECTOR,
		"Oggetto" => FORM_TEXT, "Pagamento" => FORM_TEXT_LONG,
		"Trasporto" => FORM_TEXT, "Consegna" => FORM_TEXT_LONG, "Note" => FORM_TEXT_LONG,
		"idCliente" => FORM_EXTERNAL_SELECTOR, "Referente" => FORM_TEXT, "Data" => FORM_DATE);
	private static $attribHTMLFormValueDefaultVal = array("Pagamento" => "Vs solito o da concordarsi in sede d&#39;ordine",
		"Trasporto" => "Incluso", "Note" => "Prezzi netti, IVA esclusa, salvo errori ed omissioni; Validit&agrave; 30 gg.");
	private static $attribHTMLFormIsMandatory = array(STD_ID => true, "idAgente" => true, "Oggetto" => true,
		"Pagamento" => false, "Trasporto" => true, "Consegna" => false,
		"Note" => false, "idCliente" => false, "Referente" => false, "Data" => true);

	/**
	 * Restituisce l'HTML per creare un campo di un form adatto a contenere il
	 * valore dell'attribbuto passato. Questo campo di testo sarà vuoto e dovrà
	 * servire per la creazione di una nuova istanza in DB di questo model.
	 * @param string $attribName Nome dell'attributo su cui creare il campo.
	 * @return string Stringa contenente l'HTML dell'elemento creato.
	 */
	public function getAddFormCodeFromAttribute($db,$attribName)
	{
		if(!isset(self::$attribHTMLFormValue[$attribName]) || $attribName == STD_ID)
			return "";
		$defVal = isset(self::$attribHTMLFormValueDefaultVal[$attribName]) ? self::$attribHTMLFormValueDefaultVal[$attribName] : "";
		switch(self::$attribHTMLFormValue[$attribName])
		{
			case FORM_TEXT: return ModelUtils::getTextFormElement($attribName, $defVal, self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_TEXT_LONG: return ModelUtils::getLongTextFormElement($attribName, $defVal, NULL, NULL, self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_EXTERNAL_SELECTOR:
				if($attribName == "idAgente")
					return ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Agente", "", "", self::$attribHTMLFormIsMandatory[$attribName]);
				else
				{
					$defIdToSet = isset($this->dataTupla["idCliente"]) && $this->dataTupla["idCliente"] != NULL ? $this->dataTupla["idCliente"] : "";
					$defIdLabelToSet = "";
					if($defIdToSet != "")
						$defIdLabelToSet = $this->getCliente($db) == NULL ? "" : $this->getCliente($db)->getLabel();
					return ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Cliente", $defIdToSet, $defIdLabelToSet, self::$attribHTMLFormIsMandatory[$attribName], array("Referente" => "Referente"));
				}
			//per il campo data il valore di default è la data corrente
			case FORM_DATE: return ModelUtils::getDateFormElement($attribName, time(), self::$attribHTMLFormIsMandatory[$attribName]);
			default: return "";
		}
	}

	/**
	 * Restituisce l'HTML per creare un campo di testo adatto a contenere il
	 * valore dell'attribbuto passato. Questo campo di testo conterrà il valore
	 * attualmente assunto da questo attributo in questa tupla.
	 * @param DatabaseManager $db Database su cui effettuare una possibile
	 * interrogazione.
	 * @param string $attribName Nome dell'attributo di cui creare il codice.
	 * @return string Il codice HTML dell'elemento form corrispondente.
	 */
	public function getEditFormCodeFromAttribute($db, $attribName)
	{
		switch(self::$attribHTMLFormValue[$attribName])
		{
			case FORM_HIDDEN: return ModelUtils::getHiddenFormElement($attribName, $this->dataTupla[$attribName], self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_TEXT: return ModelUtils::getTextFormElement($attribName, $this->dataTupla[$attribName], self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_TEXT_LONG: return ModelUtils::getLongTextFormElement($attribName, $this->dataTupla[$attribName], NULL, NULL, self::$attribHTMLFormIsMandatory[$attribName]);
			case FORM_EXTERNAL_SELECTOR:
				if($attribName == "idAgente")
					return ($this->getAgente($db) == NULL) ?
							$this->getAddFormCodeFromAttribute ($db, $attribName) :
							ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Agente", $this->dataTupla[$attribName], $this->getAgente($db)->getLabel(), self::$attribHTMLFormIsMandatory[$attribName]);
				else
					return ($this->getCliente($db) == NULL) ?
							$this->getAddFormCodeFromAttribute ($db, $attribName) :
							ModelUtils::getExternalSelectorFormElement($attribName, "externalSelector.php", "Cliente", $this->dataTupla[$attribName], $this->getCliente($db)->getLabel(), self::$attribHTMLFormIsMandatory[$attribName], array("Referente" => "Referente"));
			//per il campo data il valore di default è la data corrente
			case FORM_DATE: return ModelUtils::getDateFormElement($attribName, time(), self::$attribHTMLFormIsMandatory[$attribName]);
			default: return "";
		}
	}

	/**
	 * Costruttore che acquisisce l'array dei valori associativi.
	 * @param type $data L'array associativo a cui inizializzare questa istanza.
	 */
	public function __construct($data = NULL)
	{
		parent::__construct($data);
	}

	/**
	 * Crea una nuova istanza della sottoclasse specializzante.
	 * @param array $data I dati passati da cui recuperare i valori.
	 * @return mixed Una nuova instanza della sottoclasse specializzante.
	 */
	public function createNew($data)
	{
		if(isset($data["Data"]) && is_array($data["Data"]))
			$data["Data"] = ModelUtils::getDateFromFormRequest("Data", $data);
		$res = new Offerta($data);
		//se l'array contiene già le informazioni sull'agente lo si crea direttamente anch'esso
		if(isset($data["NomeAgente"]) && isset($data["CognomeAgente"]) && isset($data["idAgente"]))
		{
			$agenteData = array();
			$agenteData[STD_ID] = $data["idAgente"];
			$agenteData["Nome"] = $data["NomeAgente"];
			$agenteData["Cognome"] = $data["CognomeAgente"];
			$res->chachedAgente = Agente::getInstance()->createNew($agenteData);
		}
		//se l'array contiene già le informazioni sul cliente lo si crea direttamente anch'esso
		if(isset($data["RagsocCliente"]) && isset($data["idCliente"]))
		{
			$clienteData = array();
			$clienteData[STD_ID] = $data["idCliente"];
			$clienteData["Ragsoc"] = $data["RagsocCliente"];
			$clienteData["Referente"] = $data["ReferenteCliente"];
			$res->chachedCliente = Cliente::getInstance()->createNew($clienteData);
		}
		return $res;
	}

	/**
	 * Duplica i valori di una tupla, nel DB.
	 * Eventuali sottoclassi potrebbero implementare questo metodo per duplicare
	 * anche le associazioni NxN con un altra tabella.
	 * @param DatabaseManager $db Database su cui effettuare l'INSERT.
	 * @return mixed Restituisce l'istanza corrispondete alla nuova tupla se
	 * l'INSERT è andato a buon fine, NULL altrimenti.
	 */
	public function duplicateInDB($db)
	{
		if(is_int($this->dataTupla["Data"]))
			$this->dataTupla["Data"] = Utils::dateToMySqlFormat($this->dataTupla["Data"]);
		$oldid = $this->dataTupla[STD_ID];
		$newInst = parent::duplicateInDB($db);
		ArticoloOfferta::getInstance()->duplicateFromIDOfferta($db,$oldid,$newInst->dataTupla[STD_ID]);
		VariazioneArticoloOfferta::getInstance()->duplicateFromIDOfferta($db,$oldid,$newInst->dataTupla[STD_ID]);
		return $newInst;
	}
	
	/**
	 * Aggiungi i valori di questa istanza al DB. L'ID di questa istanza
	 * assumerà il valore della chiave primaria della tupla appena inserita nel
	 * DB.
	 * @param DatabaseManager $db Database su cui effettuare l'INSERT.
	 * @return boolean Restituisce vero se l'INSERT è andato a buon fine, falso
	 * altrimenti.
	 */
	public function addToDB($db)
	{
		if(is_int($this->dataTupla["Data"]))
			$this->dataTupla["Data"] = Utils::dateToMySqlFormat($this->dataTupla["Data"]);
		return parent::addToDB($db);
	}
	
	/**
	 * Aggiorna I dati nel DB con quelli di questa istanza.
	 * @param DatabaseManager $db Database su cui effettuare l'UPDATE.
	 * @return boolean Restituisce vero se l'UPDATE è andato a buon fine, falso
	 * altrimenti.
	 */
	public function updateDB($db)
	{
		if(is_int($this->dataTupla["Data"]))
			$this->dataTupla["Data"] = Utils::dateToMySqlFormat($this->dataTupla["Data"]);
		return parent::updateDB($db);
	}

	/**
	 * Metodo che restituisce una etichetta che rappresenta il valore di un
	 * attributo: nella sua versione di default ritorna esattamente il valore
	 * associato a quell'attributo, ma è possibile implementarlo nelle
	 * sottoclassi per specificare opportuni comportamenti, come ad esempio di
	 * non far stampare un numero che rappresenta una chiave esterna, ma invece
	 * una etichetta della tupla ad essa associata.
	 * @param DatabaseManager $db Database su cui poter effettuare una possibile
	 * interrogazione.
	 * @param string $attrib Attributo di cui stampare l'etichetta del valore.
	 * @return string Il valore associato all'attributo o NULL se l'attributo
	 * non è stato trovato.
	 */
	public function getDataLabel($db, $attrib)
	{
		if($attrib == "idAgente")
			return $this->getAgente($db) == NULL ? "" : $this->getAgente($db)->getLabel();
		if($attrib == "idCliente")
			return $this->getCliente($db) == NULL ? "" : $this->getCliente($db)->getLabel();
		if($attrib == "Data")
			return is_int($this->dataTupla[$attrib]) ? 
					Utils::textualDateFormat($this->dataTupla[$attrib]) :
					Utils::textualDateFormat(Utils::mySqlDateFormatToUnixTimestamp($this->dataTupla[$attrib]));
		return parent::getDataLabel($db, $attrib);
	}

	private $chachedAgente = NULL;
	private $chachedCliente = NULL;

	/**
	 * Ritorna una istanza di Agente corrispondente alla chiave esterna
	 * "idAgente" di questa tupla.
	 * @param DatabaseManager $db Database da interrogare.
	 * @return Agente L'instanza creata o NULL in caso di errore.
	 */
	public function getAgente($db)
	{
		$idag = isset($this->dataTupla["idAgente"]) ? $this->dataTupla["idAgente"] : NULL;
		if($idag != NULL && $idag > 0)
		{
			if($this->chachedAgente == NULL || $this->chachedAgente->dataTupla[STD_ID] != $idag)
			{
				$this->chachedAgente = Agente::getInstance()->getFromDB($db, $this->dataTupla["idAgente"]);
				return $this->chachedAgente;
			}
			else
				return $this->chachedAgente;
		}
		return NULL;
	}

	/**
	 * Ritorna una istanza di Cliente corrispondente alla chiave esterna
	 * "idCliente" di questa tupla.
	 * @param DatabaseManager $db Database da interrogare.
	 * @return Cliente L'instanza creata o NULL in caso di errore.
	 */
	public function getCliente($db)
	{
		$idag = isset($this->dataTupla["idCliente"]) ? $this->dataTupla["idCliente"] : NULL;
		if($idag != NULL && $idag > 0)
		{
			if($this->chachedCliente == NULL || $this->chachedCliente->dataTupla[STD_ID] != $idag)
			{
				$this->chachedCliente = Cliente::getInstance()->getFromDB($db, $this->dataTupla["idCliente"]);
				return $this->chachedCliente;
			}
			else
				return $this->chachedCliente;
		}
		return NULL;
	}

	/**
	 * Carica dal DB una lista di istanze di questa sottoclasse caricate con i
	 * valori delle tuple trovate secondo le specifiche passate.
	 * @param DatabaseManager $db Database da cui prelevare le tuple.
	 * @param int $limitMin Limite basso da cui iniziare a prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param int $limitMax Limite alto a cui fermarsi di prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param string $orderBy Ordinamento con cui prelevare le tuple, o "" per
	 * non usare alcun ordinamento.
	 * @return array L'array delle nuove istanze create a partire dai valori
	 * trovati nel DB o NULL nel caso qualcosa sia andato storto.
	 */
	public function getListFromDB($db, $limitMin, $limitMax, $orderBy, $cond = "")
	{
		$limits = ($limitMin === NULL || $limitMax === NULL ? "" : ($limitMin.", ".($limitMax-$limitMin)) );
		//SELECT cliente.*, agente.Nome, agente.Cognome FROM cliente LEFT JOIN agente ON cliente.idAgente = agente.ID
		$rs = $db->EnumerateTableStartExt(self::joinSelect, self::joinTable, $orderBy,$cond,$limits);
		if($rs == FALSE)
			return NULL;
		$retarr = array();
		while($db->EnumerateTableNext($rs))
			$retarr[] = $this->createNew($db->EnumerateTableGetValues($rs));
		return $retarr;
	}
	
	/**
	 * Carica dal DB una lista di istanze di questa sottoclasse caricate con i
	 * valori delle tuple trovate secondo le specifiche passate.
	 * @param DatabaseManager $db Database da cui prelevare le tuple.
	 * @param int $limitMin Limite basso da cui iniziare a prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param int $limitMax Limite alto a cui fermarsi di prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param string $orderBy Ordinamento con cui prelevare le tuple, o "" per
	 * non usare alcun ordinamento.
	 * @return array L'array delle nuove istanze create a partire dai valori
	 * trovati nel DB o NULL nel caso qualcosa sia andato storto.
	 */
	public function getListFromDBByIDCliente($db, $idCliente, $limitMin = NULL , $limitMax = NULL, $orderBy = "")
	{
		$limits = ($limitMin === NULL || $limitMax === NULL ? "" : ($limitMin.", ".($limitMax-$limitMin)) );
		$rs = $db->EnumerateTableStartExt(self::joinSelect, self::joinTable, $orderBy,"idCliente = ".$idCliente,$limits);
		if($rs == FALSE)
			return NULL;
		$retarr = array();
		while($db->EnumerateTableNext($rs))
			$retarr[] = $this->createNew($db->EnumerateTableGetValues($rs));
		return $retarr;
	}

	/**
	 * Cerca una serie di tuple nel DB e ritorna tante istanze della sottoclasse
	 * specializzante, quante sono le rispettive tuple trovate con i rispettivi
	 * valori caricati entro i limiti specificati.
	 * @param DatabaseManager $db Database da cui prelevare le tuple.
	 * @param string $paramName Nome dell'attributo su cui effettuare la
	 * ricerca.
	 * @param string $paramValue Valore che l'attributo deve assumere per
	 * includere la sua rispettiva tupla.
	 * @param int $limitMin Limite basso da cui iniziare a prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param int $limitMax Limite alto a cui fermarsi di prelevare tuple, o
	 * NULL per non usare i limiti.
	 * @param string $orderBy Ordinamento con cui prelevare le tuple, o "" per
	 * non usare alcun ordinamento.
	 * @return array L'array delle nuove istanze create a partire dai valori
	 * trovati nel DB o NULL nel caso qualcosa sia andato storto.
	 */
	public function searchByParam($db, $paramName, $paramValue, $limitMin, $limitMax, $orderBy)
	{
		if(!isset($this->attribIsNumeric[$paramName]))
			return NULL;
		$limits = ($limitMin === NULL || $limitMax === NULL ? "" : ($limitMin.", ".($limitMax-$limitMin)) );
		$cond = NULL;
		if($paramName == "idAgente")
		{
			//se il parametro della ricerca è idAgente, allora la ricerca si effettua su Nome e Cognome dell'agente
			$cond = "Agente.Nome LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%' OR Agente.Cognome LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%'";
		}
		elseif($paramName == "idCliente")
		{
			//se il parametro della ricerca è idCliente, allora la ricerca si effettua su Ragsoc del cliente
			$cond = "Cliente.Ragsoc LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%'";
		}
		else
		{
			//caso contrario si effettua sul parametro specificato come di norma
			$paramIsNumeric = $this->attribIsNumeric[$paramName];
			if($paramName == STD_ID)
				$paramName = $this->attribTableName.".".STD_ID;
			$cond = ($paramIsNumeric ? $paramName." = ".$paramValue : $paramName." LIKE '%".ModelUtils::escape_sq_for_SQL($paramValue)."%'");
		}
		$rs = $db->EnumerateTableStartExt(self::joinSelect, self::joinTable, $orderBy, $cond, $limits );
		if($rs == FALSE)
			return NULL;
		$retarr = array();
		while($db->EnumerateTableNext($rs))
			$retarr[] = $this->createNew($db->EnumerateTableGetValues($rs));
		return $retarr;
	}

	/**
	 * Restituiscce il numero di tuple del risultato della ricerca.
	 * @param DatabaseManager $db Database da interrogare.
	 * @param string $searchAttrib Nome dell'attributo su cui effettuare la
	 * ricerca.
	 * @param string $searchVal Valore che l'attributo deve assumere per far
	 * contare la propria tupla.
	 * @return int Restituisce il numero di tuple trovate o FALSE in caso di
	 * errore.
	 */
	public function getRecordsNumOfSearchResult($db,$searchAttrib,$searchVal)
	{
		if(!isset($this->attribIsNumeric[$searchAttrib]))
			return FALSE;
		$cond = NULL;
		if($searchAttrib == "idAgente")
		{
			//se il parametro della ricerca è idAgente, allora la ricerca si effettua su Nome e Cognome dell'agente
			$cond = "Agente.Nome LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%' OR Agente.Cognome LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%'";
		}
		elseif($searchAttrib == "idCliente")
		{
			//se il parametro della ricerca è idCliente, allora la ricerca si effettua su Ragsoc del cliente
			$cond = "Cliente.Ragsoc LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%'";
		}
		else
		{
			//caso contrario si effettua sul parametro specificato come di norma
			$paramIsNumeric = $this->attribIsNumeric[$searchAttrib];
			if($searchAttrib == STD_ID)
				$searchAttrib = $this->attribTableName.".".STD_ID;
			$cond = ($paramIsNumeric ? $searchAttrib." = ".$searchVal : $searchAttrib." LIKE '%".ModelUtils::escape_sq_for_SQL($searchVal)."%'");
		}
		return $db->GetRecordsNum(self::joinTable,$cond);
	}

	/**
	 * Crea un oggetto di tipo PHPExcel corrispondente a questa offerta.
	 * Questo metodo richiede che i dati della tupla siano già stati caricati
	 * dal BD in memoria.
	 * @param DatabaseManager $db Database da interrogare.
	 * @return PHPExcel L'oggetto che può essere "stampato" in output.
	 */
	private function createPHPExcelObj($db)
	{
		if(!isset($this->dataTupla[STD_ID]) || $this->dataTupla[STD_ID] == NULL)// || $this->getCliente($db) == NULL)
		{
			$this->setLastPrintError("I parametri passati non sono corretti!");
			return self::PRINT_FILE_FAILED;
		}
		$this->cutLongStrings(false);

		//Excel 2007 ha un problema per la funzione vai a capo automatico sulle celle unite quindi la funzione wraptext e shrinktofit non funziona 
		//excel 2007
		//
		//Imposto il fuso Orario: Fondamentale affinchè il file excel sia ben interpretato da Microsoft Excel
		date_default_timezone_set('Europe/Rome');
		
		$objPHPExcel = new PHPExcel();
		// Set document properties
		/*$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
							 ->setLastModifiedBy("Maarten Balliauw")
							 ->setTitle("Office 2007 XLSX Test Document")
							 ->setSubject("Office 2007 XLSX Test Document")
							 ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
							 ->setKeywords("office 2007 openxml php")
							 ->setCategory("Test result file");*/
		$logopath = "img/logo.jpg";
		$cliente = $this->getCliente($db);
		$ragsoc = " ";
		$indirizzo = " ";
		$cap = " ";
		$citta = " ";
		$provincia = " ";
		$referente = " ";
		if($cliente != NULL)
		{
			$ragsoc = $cliente->dataTupla['Ragsoc'];
			$indirizzo = $cliente->dataTupla['Indirizzo'];
			$cap = $cliente->dataTupla['CAP'];
			$citta = $cliente->dataTupla['Citta'];
			$provincia = $cliente->dataTupla['Provincia'];
			if($provincia != "")
				$provincia = "(".$provincia.")";
			$referente = $this->dataTupla['Referente'];//$cliente->dataTupla['Referente'];
		}
		//mi prendo tutti gli articoli e variazioni articoli
		$articoliList = ArticoloOfferta::getInstance()->getListFromDBByIDOfferta($db, $this->dataTupla[STD_ID]);
		$varArticoliList = VariazioneArticoloOfferta::getInstance()->getListFromDBByIDOfferta($db, $this->dataTupla[STD_ID]);
		if($articoliList === NULL)
			$articoliList = array();
		if($varArticoliList === NULL)
			$varArticoliList = array();
		
		$totaleOfferta = 0;
		foreach($varArticoliList as $varArticolo)
		{
			$varArticolo->cutLongStrings(false);
			$totaleOfferta += $varArticolo->dataTupla["Totale"];
		}
		foreach($articoliList as $articolo)
		{
			$articolo->cutLongStrings(false);
		}
		// Accediamo alla scheda 0
		$sheet = $objPHPExcel->setActiveSheetIndex(0);
		$sheet->setTitle('Offerta');
		$sheet->getDefaultStyle()->getFont()->setName('Verdana');
		
		$sheet->mergeCells('B2:G2');
		$sheet->getStyle('B2:G2')->getFont()->setSize(8);	
		// Rapporto centimetri e valori dimensioni
		/*$dimw = 4;
		$dimh = 28;*/
		//numero di pixel per carattere
		$dimw = 64.0/9.140625;
		//padding delle celle in larghezza
		$cellsPadding = 9.140625-8.43;
		//impostiamo 1 cm di larghezza per A
		/*$sheet->getColumnDimension('A')->setWidth(3.29+$cellsPadding);//1*$dimw);
		$sheet->getColumnDimension('B')->setWidth(19.29+$cellsPadding);////4.94*$dimw);
		$sheet->getColumnDimension('C')->setWidth(57.14+$cellsPadding);//14.29*$dimw);
		$sheet->getColumnDimension('D')->setWidth(3.71+$cellsPadding);//1.09*$dimw);
		$sheet->getColumnDimension('E')->setWidth(7.86+$cellsPadding);//2.12*$dimw);
		$sheet->getColumnDimension('F')->setWidth(10.86+$cellsPadding);//2.86*$dimw);
		$sheet->getColumnDimension('G')->setWidth(10.43+$cellsPadding);//2.75*$dimw);*/
		$sheet->getColumnDimension('H')->setWidth(3.29+$cellsPadding);//2.75*$dimw);
		
		//PARAMETRI PER IL LAYOUT DEL FILE EXCEL (STAMPA IN PAGINA A4)
		$objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
		//Setto i margini della foglio di stampa
		$objPHPExcel->getActiveSheet()->getPageMargins()->setRight(0.5); 
		$objPHPExcel->getActiveSheet()->getPageMargins()->setLeft(0.5);
		$objPHPExcel->getActiveSheet()->getPageMargins()->setTop(0.9);
		//Adatto la larghezza del file excel per farlo entrare in una pagina
		$objPHPExcel->getActiveSheet()->getPageSetup()->setFitToWidth(1); 
		$objPHPExcel->getActiveSheet()->getPageSetup()->setFitToHeight(0);
		$objPHPExcel->getActiveSheet()->getPageSetup()->setHorizontalCentered(true);

		$sheet->getRowDimension(1)->setRowHeight(15.75);//0.56*$dimh);
		$sheet->getRowDimension(2)->setRowHeight(137.25);
		$sheet->getRowDimension(3)->setRowHeight(50.25);
		$sheet->getRowDimension(4)->setRowHeight(20.25);
		$sheet->getRowDimension(5)->setRowHeight(15);
		$sheet->getRowDimension(6)->setRowHeight(15);
		$sheet->getRowDimension(7)->setRowHeight(15);
		$sheet->getRowDimension(8)->setRowHeight(18.75);
		//LOGO----------------------------------------
		//unione delle celle per il logo
		
		//inserimento del logo
		$objDrawing = new PHPExcel_Worksheet_Drawing();
		$objDrawing->setName('Logo');
		$objDrawing->setDescription('Logo');
		$objDrawing->setPath($logopath);
		$objDrawing->setResizeProportional(true);
		$objDrawing->setWidth((19.29+57.14+3.71+7.86+10.86+10.43)*$dimw);
		$objDrawing->setOffsetX(10);
	    $objDrawing->setOffsetY(10);

		
		$objDrawing->setWorksheet($sheet);
		$objDrawing->setCoordinates('B2');
		$drawingStyle = $sheet->getStyle('B2:G2');
		$styleArray = array(
			'borders' => array(
				'outline' => array(
					'style' => PHPExcel_Style_Border::BORDER_THIN,
					'color' => array('argb' => 'FF000000'),
					),
				),
			);
		$drawingStyle->applyFromArray($styleArray);
		$drawingStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)
									 ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
									 ->setWrapText(true)
									 ->setShrinkToFit(true);
		//INTESTAZIONE--------------------------------
		$headerText = Parameters::getParameter($db, Parameters::PARAMETER_PRINT_HEADING);
		$sheet->mergeCells('B3:G3');
		$cellstyle = $sheet->getStyle('B3:G3');
		
		/*$cellstyle->applyFromArray($styleArray);*/
		$cellstyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
								  ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)
								  ->setWrapText(true)
								  ->setShrinkToFit(true);
		$background = $cellstyle->getFill();
		$background->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
		$background->getStartColor()->setARGB('40F2DDDC');
		/*$cellstyle->getFont()->getColor()->setARGB('FF800000');
		$cellstyle->getFont()->setSize(9);*/
		//Per i Richtext bisogna impostare il font direttamente sul testo, e non vale se impostato per tutta la pagina
		$objRichText = new PHPExcel_RichText();
		$objRichText->createTextRun("AGENZIA ILLUMINOTECNICA ")->getFont()->setSize(9)->setName('Verdana')
																		  ->getColor()->setARGB('FF800000');
		$objRichText->createTextRun("CAMPANIA - BASILICATA\n")->getFont()->setBold(true)
																		 ->setSize(9)->setName('Verdana')
																		 ->getColor()->setARGB('FF800000');
		$objRichText->createTextRun($headerText)->getFont()->setBold(true)
														   ->setSize(12)->setName('Verdana')
														   ->getColor()->setARGB('FF800000');
		
		$sheet->getCell('B3')->setValue($objRichText);
		//OFFERTA DEL 'DATA'--------------------------
		$sheet->mergeCells('B4:G4');
		$cellstyle = $sheet->getStyle('B4:G4');
		//L'Allineamento vertical e orizzantale va impostato prima dell'inserimento del testo
		$cellstyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
		$cellstyle->applyFromArray($styleArray);
		$sheet->getCell('B4')->setValue("OFFERTA DEL ".$this->getDataLabel($db, "Data")/*date("d/m/Y")*/."")
							 ->getStyle()->getFont()->setBold(true)
													->setSize(13);
		
		
		//Cliente dell'Offerta:
		$sheet->mergeCells('C5:G5');
		$sheet->mergeCells('C6:G6');
		$sheet->mergeCells('C7:G7');
		
		//Con queste attive contengo l'allargamento
		$sheet->getStyle('C5:G5')->applyFromArray($styleArray);
		$sheet->getStyle('C6:G6')->applyFromArray($styleArray);
		$sheet->getStyle('C7:G7')->applyFromArray($styleArray);
		
		//Ragione Sociale
		$sheet->getCell('C5')->setValue("Spett.le ".$ragsoc."")->getStyle()->getFont()->setBold(true);
		$sheet->getStyle('C5:G5')->getFont()->setSize(13);	
		$sheet->getCell('C5')->getStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
																								->setWrapText(true)
																								->setShrinkToFit(true);
		
		//Indirizzo
		$sheet->getCell('C6')->setValue($indirizzo)->getStyle()->getFont();
		$sheet->getStyle('C6:G6')->getFont()->setSize(13);		
		$sheet->getCell('C6')->getStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
																								->setWrapText(true)
																								->setShrinkToFit(true);;
		
		//Cap Città Provincia
	    $sheet->getCell('C7')->setValue($cap." ".$citta." ".$provincia)->getStyle()->getFont()->setBold(true);
		$sheet->getStyle('C7:G7')->getFont()->setSize(13);
		$sheet->getCell('C7')->getStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
																								->setWrapText(true)
																								->setShrinkToFit(true);

		$sheet->getStyle('B5')->applyFromArray($styleArray);
		$sheet->getStyle('B6')->applyFromArray($styleArray);
		$sheet->getStyle('B7')->applyFromArray($styleArray);
		
		//Oggetto dell'Offerta
		$sheet->mergeCells('B8:C8');
		$sheet->mergeCells('D8:G8');
		$sheet->getStyle('B8:C8')->applyFromArray($styleArray);
		$sheet->getStyle('D8:G8')->applyFromArray($styleArray);

		$sheet->getCell('B8')->setValue("OGGETTO: ".$this->getDataLabel($db,'Oggetto'))->getStyle()->getFont()->setSize(13);
		$sheet->getCell('B8')->getStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
		$sheet->getCell('B8')->getStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER) 
																							->setWrapText(true)
																							->setShrinkToFit(true);
		
		$sheet->getCell('D8')->setValue('C.a. '.$referente)
							 ->getStyle()->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
													->getStartColor()->setARGB('FF800000');
		$sheet->getCell('D8')->getStyle()->getFont()->setBold(true)->setSize(13)->getColor()->setARGB('FFFFFFFF');
		$sheet->getCell('D8')->getStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true)
																							                     ;
		
		//Separatore prima degli articoli
		$sheet->getStyle('B9:G9')->applyFromArray($styleArray);
		
		//intestazione pre-articoli
		$singleCellOutlineBordersArray = array(
				'left' => array(
					'style' => PHPExcel_Style_Border::BORDER_THIN,
					'color' => array('argb' => 'FF000000'),
					),
				'right' => array(
					'style' => PHPExcel_Style_Border::BORDER_THIN,
					'color' => array('argb' => 'FF000000'),
					),
				'top' => array(
					'style' => PHPExcel_Style_Border::BORDER_THIN,
					'color' => array('argb' => 'FF000000'),
					),
				'bottom' => array(
					'style' => PHPExcel_Style_Border::BORDER_THIN,
					'color' => array('argb' => 'FF000000'),
					),
				'inside' => array(
					'style' => PHPExcel_Style_Border::BORDER_THIN,
					'color' => array('argb' => 'FF000000'),
					),
				);
		$sheet->getCell('B10')->setValue("\nCODICE\n");
		$sheet->getCell('C10')->setValue("\nDESCRIZIONE PRODOTTO\n");
		$sheet->getCell('D10')->setValue("\nUM\n");
		$sheet->getCell('E10')->setValue("\nQUANT.\n");
		$sheet->getCell('F10')->setValue("\nP. NETTO\nUNITARIO\n");
		$sheet->getCell('G10')->setValue("\nIMPORTO\nTOTALE\n");

		$articoliHeader = $sheet->getStyle('B10:G10');
		$articoliHeader->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFDDD9C3');
		$articoliHeader->getFont()->setSize(12)->setBold(true);
		$articoliHeader->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)
									   ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
									   ->setWrapText(true)
									   ->setShrinkToFit(true);
		$articoliHeader->getBorders()->applyFromArray($singleCellOutlineBordersArray);
		
		$sheet->getStyle('B11:G11')->applyFromArray($styleArray);
		
		$sheet->getCell('F11')->setValue("Iva esclusa");
		$sheet->getCell('G11')->setValue("Iva esclusa");

		$articoliSubHeader = $sheet->getStyle('F11:G11');
		$articoliSubHeader->getFont()->setSize(12)->setBold(true)->setItalic(true);
		$articoliSubHeader->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)
										  ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
		$articoliSubHeader->getBorders()->applyFromArray($singleCellOutlineBordersArray);
		
		//LISTA DINAMICA DI TUTTI GLI ARTICOLI--------
		$startRow = 12;
		$currentRow = $startRow;
		
		
		foreach($articoliList as $articolo)
		{
			//righe dell'articolo-------------
			$articoliHeader = $sheet->getStyle('C'.$currentRow);
			$articoliHeader->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FFDDD9C3');
			$articoliHeader->getFont()->setSize(12)->setBold(true);
			$articoliHeader->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)
										   /*->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)*/;
			//Tipo articolo
			$sheet->getCell('C'.$currentRow)->setValue($articolo->getDataLabel($db,"Tipo"));
			$currentRow++;
			//descrizione breve
			$sheet->getCell('C'.$currentRow)->setValue($articolo->getDataLabel($db,"DescrizioneBreveModificabile"));
			$sheet->getStyle('C'.$currentRow)->getFont()->setSize(12);
			$sheet->getStyle('C'.$currentRow)->getAlignment()->setWrapText(true)->setShrinkToFit(true);
			$currentRow++;
			//variazioni articoli
			foreach($varArticoliList as $varArticolo)
			{
				if($varArticolo->getVariazioneArticolo($db)->dataTupla["idArticolo"] != $articolo->getArticolo($db)->dataTupla[STD_ID])
					continue;
				//cella codice variazione articolo
				$sheet->getCell('B'.$currentRow)->setValue($varArticolo->getDataLabel($db,"Codice"));
				$cellStyle = $sheet->getStyle('B'.$currentRow);
				$cellStyle->getFont()->setSize(12)->setBold(true);
				$cellStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)
										  ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
						->setWrapText(true)->setShrinkToFit(true);
				//codice dettagli tecnici della variazione articolo
				$sheet->getCell('C'.$currentRow)->setValue($varArticolo->getDataLabel($db,"DettagliTecnici"));
				$cellStyle = $sheet->getStyle('C'.$currentRow);
				$cellStyle->getFont()->setSize(12);
				$cellStyle->getAlignment()->setWrapText(true)->setShrinkToFit(true);
				//unità di misura
				$sheet->getCell('D'.$currentRow)->setValue($articolo->getDataLabel($db,"UM"));
				$cellStyle = $sheet->getStyle('D'.$currentRow);
				$cellStyle->getFont()->setSize(12);
				//q.tà
				$sheet->getCell('E'.$currentRow)->setValue($varArticolo->getDataLabel($db,"Quantita"));
				$cellStyle = $sheet->getStyle('E'.$currentRow);
				$cellStyle->getFont()->setSize(12);
				//prezzo netto unitario
				$sheet->getCell('F'.$currentRow)->setValue($varArticolo->getDataLabel($db,"PrezzoNetto"));
				$cellStyle = $sheet->getStyle('F'.$currentRow);
				$cellStyle->getFont()->setSize(12);
				//totale sub articolo
				$sheet->getCell('G'.$currentRow)->setValue($varArticolo->getDataLabel($db,"Totale"));
				$cellStyle = $sheet->getStyle('G'.$currentRow);
				$cellStyle->getFont()->setSize(12);
				//stili
				$sheet->getStyle('D'.$currentRow.':G'.$currentRow)->getFont()->setBold(true);
				$sheet->getStyle('E'.$currentRow.':G'.$currentRow)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);
				$sheet->getStyle('F'.$currentRow.':G'.$currentRow)->getFont()->getColor()->setARGB('FFFF0000');
				$currentRow++;
			}
			
			$currentRow++;
		}
		
		//totale offerta
		$sheet->mergeCells('B'.$currentRow.':F'.$currentRow);
		$sheet->getCell('B'.$currentRow)->setValue("Totale offerta:");
		$cellStyle = $sheet->getStyle('B'.$currentRow);
		$cellStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT)
								  ->setShrinkToFit(true);
		$cellStyle->getFont()->setSize(12)
							 ->setBold(true)
							 ->getColor()->setARGB('FFFF0000');
		$sheet->getCell('G'.$currentRow)->setValue($totaleOfferta);
		$cellStyle = $sheet->getStyle('G'.$currentRow);
		$cellStyle->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);
		$cellStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT)
								  ->setShrinkToFit(true);
		$cellStyle->getFont()->setSize(12)
							 ->setBold(true)
							 ->getColor()->setARGB('FFFF0000');
		
		$sheet->getStyle('B'.$startRow.':G'.$currentRow)->getBorders()->applyFromArray($singleCellOutlineBordersArray);
		
		//Trasporto
		$currentRowBottom=$currentRow+2;
		$sheet->getRowDimension($currentRowBottom)->setRowHeight(20);
		
		$sheet->mergeCells('B'.($currentRowBottom).':C'.($currentRowBottom));
		$sheet->getCell('B'.$currentRowBottom)->setValue("Trasporto: ".$this->getDataLabel($db, "Trasporto"));
		$cellStyle = $sheet->getStyle('B'.$currentRowBottom);
		$cellStyle->getAlignment()->setWrapText(true)->setShrinkToFit(true);
		$cellStyle->getFont()->setSize(12);
		$currentRowBottom++;
		
		//Consegna
		$sheet->getRowDimension($currentRowBottom)->setRowHeight(20);
		
		$sheet->mergeCells('B'.($currentRowBottom).':C'.($currentRowBottom));
		$sheet->getCell('B'.$currentRowBottom)->setValue("Consegna: ".$this->getDataLabel($db, "Consegna"));
		$cellStyle = $sheet->getStyle('B'.$currentRowBottom);
		$cellStyle->getAlignment()->setWrapText(true)->setShrinkToFit(true);
		$cellStyle->getFont()->setSize(12);
		$currentRowBottom++;
		
		//Pagamento
		$sheet->getRowDimension($currentRowBottom)->setRowHeight(20);
		
		$sheet->mergeCells('B'.($currentRowBottom).':C'.($currentRowBottom));
		$sheet->getCell('B'.$currentRowBottom)->setValue("Pagamento: ".$this->getDataLabel($db, "Pagamento"));
		$cellStyle = $sheet->getStyle('B'.$currentRowBottom);
		$cellStyle->getAlignment()->setWrapText(true)->setShrinkToFit(true);
		$cellStyle->getFont()->setSize(12);
		$currentRowBottom+=2;
		
		//Note
		$sheet->getRowDimension($currentRowBottom)->setRowHeight(45);
		
		$sheet->mergeCells('B'.($currentRowBottom).':C'.($currentRowBottom));
		$sheet->getCell('B'.$currentRowBottom)->setValue("NOTE: ".$this->getDataLabel($db, "Note")."\n");
		$cellStyle = $sheet->getStyle('B'.$currentRowBottom.':G'.$currentRowBottom);
		$cellStyle->getFont()->setBold(true)->setSize(12);
		$cellStyle->getAlignment()->setWrapText(true)
								  ->setShrinkToFit(true);
		$currentRowBottom+=2;
		
		//Firma Agente
		$sheet->mergeCells('D'.($currentRowBottom).':G'.($currentRowBottom));
		$sheet->getCell('D'.$currentRowBottom)->setValue(Parameters::getParameter($db, Parameters::PARAMETER_PRINT_SIGNATURE));
		$cellStyle = $sheet->getStyle('D'.$currentRowBottom);
		$cellStyle->getFont()->setSize(12)->setBold(true)->getColor()->setARGB('FFC00000');
		$cellStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
								  ->setWrapText(true)->setShrinkToFit(true);
		$currentRowBottom++;
		$sheet->mergeCells('D'.($currentRowBottom).':G'.($currentRowBottom));
		$sheet->getCell('D'.$currentRowBottom)->setValue($this->getDataLabel($db, "idAgente"));
		$cellStyle = $sheet->getStyle('D'.$currentRowBottom);
		$cellStyle->getFont()->setSize(14)->setBold(true)->getColor()->setARGB('FFC00000');
		$cellStyle->getFont()/*->setItalic(true)*/->setName('Vladimir Script');
		$cellStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
								  ->setWrapText(true)->setShrinkToFit(true);
		
		$sheet->getColumnDimension('A')->setWidth(3.29+$cellsPadding);//1*$dimw);
		$sheet->getColumnDimension('B')->setWidth(19.29+$cellsPadding);////4.94*$dimw);
		$sheet->getColumnDimension('C')->setWidth(57.14+$cellsPadding);//14.29*$dimw);
		$sheet->getColumnDimension('D')->setWidth(3.71+$cellsPadding);//1.09*$dimw);
		$sheet->getColumnDimension('E')->setWidth(7.86+$cellsPadding);//2.12*$dimw);
		$sheet->getColumnDimension('F')->setWidth(10.86+$cellsPadding);//2.86*$dimw);
		$sheet->getColumnDimension('G')->setWidth(10.43+$cellsPadding);//2.75*$dimw);

		return $objPHPExcel;
		//return self::PRINT_FILE_FAILED;
	}

	/**
	 * Stampa lo stream di byte di un file excel rappresentante la stampa del
	 * model di questa istanza.
	 * @return int Ritorna il codice rappresentativo del successo o insuccesso
	 * dell'operazione.
	 */
	public function printExcelFile($db)
	{
		$excelObj = $this->createPHPExcelObj($db);
		
		if(!($excelObj instanceof PHPExcel))
		{
			return $excelObj;
		}
		
		header('Content-Type: application/vnd.ms-excel');
		$NomeFileOfferta = "";
		if($this->getCliente($db) == NULL)
			$NomeFileOfferta = date("d-m-Y").".xls";
		else
			$NomeFileOfferta = $this->getDataLabel($db, "idCliente")."_".date("d-m-Y").".xls";
		header('Content-Disposition: attachment;filename='.$NomeFileOfferta);
		header('Cache-Control: max-age=0');
		$objWriter = PHPExcel_IOFactory::createWriter($excelObj, 'Excel5');
		$objWriter->save('php://output');
		return self::PRINT_SUCCESS;
	}

	/**
	 * Stampa lo stream di byte di un file PDF rappresentante la stampa del
	 * model di questa istanza.
	 * @return int Ritorna il codice rappresentativo del successo o insuccesso
	 * dell'operazione.
	 */
	public function printHTMLFile($db)
	{
		if(!isset($this->dataTupla[STD_ID]) || $this->dataTupla[STD_ID] == NULL)// || $this->getCliente($db) == NULL)
		{
			$this->setLastPrintError("I parametri passati non sono corretti!");
			return self::PRINT_FILE_FAILED;
		}
		$this->cutLongStrings(false);
		date_default_timezone_set('Europe/Rome');
		$logopath = "img/logo.jpg";
		$cliente = $this->getCliente($db);
		$ragsoc = "&nbsp;";
		$indirizzo = "&nbsp;";
		$cap = "&nbsp;";
		$citta = "&nbsp;";
		$provincia = "&nbsp;";
		$referente = "&nbsp;";
		if($cliente != NULL)
		{
			$ragsoc = $cliente->dataTupla['Ragsoc'];
			$indirizzo = $cliente->dataTupla['Indirizzo'];
			$cap = $cliente->dataTupla['CAP'];
			$citta = $cliente->dataTupla['Citta'];
			$provincia = $cliente->dataTupla['Provincia'];
			if($provincia != "")
				$provincia = "(".$provincia.")";
			$referente = $this->dataTupla['Referente'];//$cliente->dataTupla['Referente'];
		}
		//mi prendo tutti gli articoli e variazioni articoli
		$articoliList = ArticoloOfferta::getInstance()->getListFromDBByIDOfferta($db, $this->dataTupla[STD_ID]);
		$varArticoliList = VariazioneArticoloOfferta::getInstance()->getListFromDBByIDOfferta($db, $this->dataTupla[STD_ID]);
		if($articoliList === NULL)
			$articoliList = array();
		if($varArticoliList === NULL)
			$varArticoliList = array();
		
		$totaleOfferta = 0;
		foreach($varArticoliList as $varArticolo)
		{
			$varArticolo->cutLongStrings(false);
			$totaleOfferta += $varArticolo->dataTupla["Totale"];
		}
		foreach($articoliList as $articolo)
		{
			$articolo->cutLongStrings(false);
		}
		//CONVERSIONE TRA GRANDEZZE CELLE EXCEL E PERCENTUALI COLONNE HTML:
		// B   C   D   E   F   G
		//140 405  31  60  81  78
		//795
		//18% 51%  4%  7% 10% 10%
		
		//CONVERSIONE TRA GRANDEZZE FONT EXCEL E PIXEL FONT HTML
		//font size 8 -> font size 12px
		//font size 9 -> font size 14pc
		//font size 10 -> font size 16px
		//font size 11 -> font size 18px
		//font size 12 -> font size 20px
		//font size 13 -> font size 22px
		//font size 14 -> font size 24px
		
		/*<style>
		@font-face
		{
			font-family: 'Vladimir Script';
			src: url('img/VLADIMIR.TTF');
		}
		.standardCell {
			border: #000 solid thin;
		}
		.numberCell {
			border: #000 solid thin;
			text-align: right;
		}
		</style>*/
		
		$classStyle_standardCell = "border: #000 solid thin;";
		$classStyle_numberCell = "border: #000 solid thin; text-align: right;";
		
		?>

		<style>
		@font-face
		{
			font-family: 'Vladimir Script';
			src: url('img/VLADIMIR.TTF');
		}
		</style>

		<table width="1000" cellpadding="0" cellspacing="0" border="0" style='font-family: Verdana; border-collapse:collapse;'>
			<tr height='3'>  <td width="18%"></td>  <td width="51%"></td>  <td width="4%"></td>  <td width="7%"></td>  <td width="10%"></td>  <td width="10%"></td>  </tr>
			<tr id="logoArea">
				<td colspan='6' style="border: #000 solid medium;"><img src=<?= '"'.$logopath.'"' ?> width='100%' /></td>
			</tr>
			<tr id='headerArea' style='height:70px;'>
				<td class="standardCell" colspan='6' style="<?= $classStyle_standardCell ?> background-color: #F2DDDC; color: #800000; text-align: center;">
					<span style='font-size: 14px;'>AGENZIA ILLUMINOTECNICA <b>CAMPANIA - BASILICATA</b></span><br/>
					<span style='font-size: 20px; font-weight: bold;'><?= Parameters::getParameter($db, Parameters::PARAMETER_PRINT_HEADING) ?></span>
				</td>
			</tr>
			<tr id='dataArea'>
				<td class="standardCell" colspan='6' style="<?= $classStyle_standardCell ?> padding:5px;">
					<span style='font-size: 22px;'><?= "OFFERTA DEL ".$this->getDataLabel($db, "Data")/*date("d/m/Y")*/ ?></span>
				</td>
			</tr>
			<tr id='clienteRagSocArea'>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>">&nbsp;</td>
				<td class="standardCell" colspan='5' style="<?= $classStyle_standardCell ?>text-align: center; border: #000 solid thin;">
					<span style='font-size: 22px; font-weight: bold;'><?= $ragsoc ?></span>
				</td>
			</tr>
			<tr id='clienteIndirizzoArea'>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>">&nbsp;</td>
				<td class="standardCell" colspan='5' style="<?= $classStyle_standardCell ?> text-align: center; border: #000 solid thin;">
					<span style='font-size: 22px;'><?= $indirizzo ?></span>
				</td>
			</tr>
			<tr id='clienteCittaProvArea'>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>">&nbsp;</td>
				<td class="standardCell" colspan='5' style="<?= $classStyle_standardCell ?> text-align: center; border: #000 solid thin;">
					<span style='font-size: 22px; font-weight: bold;'><?= $cap." ".$citta." ".$provincia ?></span>
				</td>
			</tr>
			<tr id="oggettoOffertaAndNomeClienteArea">
				<td class="standardCell" colspan='2' style="<?= $classStyle_standardCell ?> padding:5px;">
					<span style='font-size: 20px;'><?= "OGGETTO: ".$this->getDataLabel($db,'Oggetto') ?></span>
				</td>
				<td class="standardCell" colspan='4' style="<?= $classStyle_standardCell ?> background-color: #800000; padding:5px;">
					<span style='font-size: 16px; font-weight: bold; color: #fff;'><?= "C.a. ".$referente ?></span>
				</td>
			</tr>
			<tr id="separatorePreArticoli"><td class="standardCell" colspan="6" style="<?= $classStyle_standardCell ?> border: #000 solid thin;">&nbsp;</td></tr>
			<tr id="intestazioneArticoli" style="text-align: center; vertical-align: middle; background-color: #DDD9C3; font-weight: bold;">
				<td class="standardCell" style="<?= $classStyle_standardCell ?> padding:5px; font-size: 16px;">CODICE</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> padding:5px; font-size: 16px;">DESCRIZIONE PRODOTTO</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> padding:5px; font-size: 16px;">UM</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> padding:5px; font-size: 16px;">QUANT.</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> padding:5px; font-size: 16px;">P. NETTO<br/>UNITARIO</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> padding:5px; font-size: 16px;">IMPORTO<br/>TOTALE</td>
			</tr>
			<tr id="subIntestazioneArticoli" style="font-weight: bold; font-style: italic; text-align: center;">
				<td class="standardCell" colspan="4" style="<?= $classStyle_standardCell ?> font-size: 14px;"></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> font-size: 14px;">Iva esclusa</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> font-size: 14px;">Iva esclusa</td>
			</tr>
			<?php

			foreach($articoliList as $articolo)
			{
				//righe dell'articolo-------------
				?>
			<tr id="tipoArticoloArea" style="font-weight: bold;">
				<td class="standardCell" style="<?= $classStyle_standardCell ?>">&nbsp;</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> background-color: #DDD9C3; font-size: 16px;"><?= $articolo->getDataLabel($db,"Tipo") ?></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>"></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>"></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>"></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>"></td>
			</tr>
			<tr id="descArticoloArea">
				<td class="standardCell" style="<?= $classStyle_standardCell ?>">&nbsp;</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> font-size: 16px;"><?= $articolo->getDataLabel($db,"DescrizioneBreveModificabile") ?></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>"></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>"></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>"></td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>"></td>
			</tr>
				<?php
				foreach($varArticoliList as $varArticolo)
				{
					if($varArticolo->getVariazioneArticolo($db)->dataTupla["idArticolo"] != $articolo->getArticolo($db)->dataTupla[STD_ID])
						continue;
					?>
			<tr id="varArticoloArea">
				<td class="standardCell" style="<?= $classStyle_standardCell ?> font-size: 16px; font-weight: bold; text-align: center;">&nbsp;<?= $varArticolo->getDataLabel($db,"Codice") ?>&nbsp;</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> font-size: 16px;"><?= $varArticolo->getDataLabel($db,"DettagliTecnici") ?>&nbsp;</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?> font-size: 16px; font-weight: bold;"><?= $articolo->getDataLabel($db,"UM") ?>&nbsp;</td>
				<td class="numberCell" style="<?= $classStyle_numberCell ?> font-size: 16px; font-weight: bold;">&nbsp;<?= number_format($varArticolo->getDataLabel($db,"Quantita"), 2, ",", ".") ?></td>
				<td class="numberCell" style="<?= $classStyle_numberCell ?> font-size: 16px; font-weight: bold; color: #f00;">&nbsp;<?= number_format($varArticolo->getDataLabel($db,"PrezzoNetto"), 2, ",", ".") ?></td>
				<td class="numberCell" style="<?= $classStyle_numberCell ?> font-size: 16px; font-weight: bold; color: #f00;">&nbsp;<?= number_format($varArticolo->getDataLabel($db,"Totale"), 2, ",", ".") ?></td>
			</tr>
					<?php
				}
			?>
			<tr id="separatoreArticolo">
				<td class="standardCell" style="<?= $classStyle_standardCell ?>">&nbsp;</td><td class="standardCell">&nbsp;</td><td class="standardCell">&nbsp;</td>
				<td class="standardCell" style="<?= $classStyle_standardCell ?>">&nbsp;</td><td class="standardCell">&nbsp;</td><td class="standardCell">&nbsp;</td>
			</tr>
			<?php
			}
			?>
			<tr id="totaleOffertaArea" style="font-weight: bold; color: #f00;">
				<td class="standardCell" colspan="5" style="<?= $classStyle_standardCell ?> font-size: 16px; text-align: right;">Totale offerta:</td>
				<td class="numberCell" style="<?= $classStyle_numberCell ?> font-size: 16px;"><?= number_format($totaleOfferta, 2, ",", ".") ?></td>
			</tr>
			<tr id="separatoreDettagli"><td colspan="6">&nbsp;</td></tr>
			<tr id="trasportoArea">
				<td colspan="2" style="font-size: 16px;"><?= "Trasporto: ".$this->getDataLabel($db, "Trasporto") ?></td><td colpspan="4"></td>
			</tr>
			<tr id="separatoreConsegna"><td colspan="6">&nbsp;</td></tr>
			<tr id="consegnaArea">
				<td colspan="2" style="font-size: 16px;"><?= "Consegna: ".$this->getDataLabel($db, "Consegna") ?></td><td colpspan="4"></td>
			</tr>
			<tr id="separatorePagamento"><td colspan="6">&nbsp;</td></tr>
			<tr id="pagamentoArea">
				<td colspan="2" style="font-size: 16px;"><?= "Pagamento: ".$this->getDataLabel($db, "Pagamento") ?></td><td colpspan="4"></td>
			</tr>
			<tr id="separatoreNote"><td colspan="6">&nbsp;</td></tr>
			<tr id="pagamentoArea">
				<td colspan="2" style="font-size: 16px; font-weight: bold;"><?= "NOTE: ".$this->getDataLabel($db, "Note") ?></td><td colpspan="4"></td>
			</tr>
			<tr id="separatoreFirma"><td colspan="6">&nbsp;</td></tr>
			<tr id="firmaArea" style="font-weight: bold; color: #C00000; text-align: center;">
				<td colspan="2"></td><td colspan="4" style="font-size: 18px;"><?= Parameters::getParameter($db, Parameters::PARAMETER_PRINT_SIGNATURE) ?></td>
			</tr>
			<!--
				<tr id="firma2Area" style="font-family: 'Vladimir Script'; font-weight: bold; color: #C00000; text-align: center;">
					<td colspan="2"></td><td colspan="4" style="font-size: 20px;"></td>
			-->
			<tr id="firma2Area" style="text-align: center;">
				<td colspan="2"></td><td colspan="4"><img src=<?= "'Lib/printSignatureAsImage.php?FontSize=20&FontColor=".(0xff0000)."&SignatureText=".urlencode($this->getDataLabel($db, "idAgente"))."'" ?></td>
			</tr>
		</table>
		<?php
		return self::PRINT_SUCCESS;
	}

	/**
	 * Restituisce una bitmask che rappresenta quali stampe supporta questo
	 * model.
	 * @return int La maschera di bit che rappresenta quali stampe sono
	 * supportate e quali no; PRINT_UNAVAILABLE viene restituito se questo model
	 * non supporta alcuna stampa.
	 */
	public function isPrintAvailable()
	{
		return self::PRINT_FULLY_AVAILABLE;
	}

	/**
	 * Restituisce vero se questa offerta ha informazioni necessarie per creare
	 * un ordine a partire da essa.
	 * @return boolean Se è possibile creare un ordine da questa offerta o meno.
	 */
	public function canCreateOrder()
	{
		return (isset($this->dataTupla["idAgente"]) && $this->dataTupla["idAgente"] > 0 &&
				isset($this->dataTupla["idCliente"]) && $this->dataTupla["idCliente"] > 0 &&
				isset($this->dataTupla["Pagamento"]) && $this->dataTupla["Pagamento"] != NULL &&
				isset($this->dataTupla["Trasporto"]) && $this->dataTupla["Trasporto"] != NULL &&
				isset($this->dataTupla["Consegna"]) && $this->dataTupla["Consegna"] != NULL);
	}

	/**
	 * Questo metodo restituisce tutti i campi che devono essere
	 * obbligatoriamente compilati affinchè possa essere creato un ordine a
	 * partire da questa offerta.
	 * @return string L'esenco di tutti i campi obbligatori.
	 */
	public function getMandatoryFieldsToCreateOrder()
	{
		return		 $this->attribLongNames["idAgente"].", ".$this->attribLongNames["idCliente"].
				", ".$this->attribLongNames["Pagamento"].", ".$this->attribLongNames["Trasporto"].
				", ".$this->attribLongNames["Consegna"];
	}

	/**
	 * Crea un ordine a partire da questa offerta.
	 * @param DatabaseManager $db Database da interrogare e modificare con le
	 * nuove informazioni sul nuovo ordine.
	 * @return Ordine Restituisce il nuovo oggetto creato o NULL se la creazione
	 * è fallita.
	 */
	public function createOrder($db)
	{
		$cliente = $this->getCliente($db);
		if(!$cliente)
			return NULL;
		$ordineData = array();
		$ordineData["idAgente"] = $this->dataTupla["idAgente"];
		$ordineData["idCliente"] = $this->dataTupla["idCliente"];
		$ordineData["idAziendaRappresentata"] = NULL;
		$ordineData["idOfferta"] = $this->dataTupla[STD_ID];
		$ordineData["BancaAziendaRappresentata"] = NULL;
		$ordineData["IbanAziendaRappresentata"] = NULL;
		$ordineData["OpzioneIbanBancaAziendaRappresentata"] = 1;
		$ordineData["Indirizzo"] = ($cliente->dataTupla["Indirizzo"] == NULL ? "Da specificare..." : $cliente->dataTupla["Indirizzo"]);
		$ordineData["Contatto"] = "Da specificare...";
		$ordineData["TermineDiConsegna"] = ($this->dataTupla["Consegna"] == NULL ? "Da specificare..." : $this->dataTupla["Consegna"]);
		$ordineData["OrdineDelCliente"] = "Da specificare...";
		$ordineData["Cup"] = "Da specificare...";
		$ordineData["Cig"] = "Da specificare...";
		$ordineData["Trasporto"] = ($this->dataTupla["Trasporto"] == NULL ? "Da specificare..." : $this->dataTupla["Trasporto"]);
		$ordineData["Pagamento"] = ($this->dataTupla["Pagamento"] == NULL ? ($cliente->dataTupla["CondizioniPagamento"] == NULL ? "Da specificare..." : $cliente->dataTupla["CondizioniPagamento"]) : $this->dataTupla["Pagamento"]);
		$ordineData["BancaCliente"] = $cliente->dataTupla["Banca"];
		$ordineData["IbanCliente"] = $cliente->dataTupla["IBAN"];
		$ordineData["E_MailTecnica"] = $cliente->dataTupla["E_MailTecnico"];
		$ordineData["E_MailCommerciale"] = $cliente->dataTupla["E_MailCommerciale"];
		$ordineData["E_MailAmministrativa"] = $cliente->dataTupla["E_MailAmministrativo"];
		$ordineData["E_MailPec"] = $cliente->dataTupla["E_MailPec"];
		$ordineData["Data"] = time();
		$ordineData["Note"] = $this->dataTupla["Note"];
		$newOrdineObj = Ordine::getInstance()->createNew($ordineData);
		if(!$newOrdineObj->addToDB($db))
			return NULL;
		$db->AddRecordsWithSELECT(VariazioneArticoloOrdine::getInstance()->attribTableName, "idVariazioneArticolo, idOrdine, PrezzoNetto, Quantita, Totale",
				"SELECT idVariazioneArticolo, ".$newOrdineObj->dataTupla[STD_ID].", PrezzoNetto, Quantita, Totale FROM ".VariazioneArticoloOfferta::getInstance()->attribTableName." WHERE idOfferta = ".$this->dataTupla[STD_ID]);
		$db->AddRecordsWithSELECT(ArticoloOrdine::getInstance()->attribTableName, "idArticolo, idOrdine, TipoModificabile, DescrizioneBreveModificabile",
				"SELECT idArticolo, ".$newOrdineObj->dataTupla[STD_ID].", TipoModificabile, DescrizioneBreveModificabile FROM ".ArticoloOfferta::getInstance()->attribTableName." WHERE idOfferta = ".$this->dataTupla[STD_ID]);
		return $newOrdineObj;
	}

}

?>
